/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package com.ipartek.formacion.gestformwww.controlador;

import com.ipartek.formacion.gestformwww.modelo.ModeloCandidato;
import com.ipartek.formacion.gestformwww.modelo.ModeloSMS;
import com.ipartek.formacion.gestformwww.modelo.beans.Candidato;
import com.ipartek.formacion.gestformwww.modelo.beans.InformeSms;
import com.ipartek.formacion.gestformwww.modelo.beans.SMSEnviosCandidato;
import com.ipartek.formacion.gestformwww.modelo.beans.excepciones.GestorFormacionExcepcion;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Date;
import java.util.ResourceBundle;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 *
 * @author Cris & Fran
 */
public class EnviarSMSCandidatoAccion implements Accion {


    private final String visualizarconvocatoria = "visualizar-convocatoria-accion";
    //private final String visualizarenviarSMS = "visualizar-enviar-sms-accion";

    public AccionRouter ejecuta(HttpServlet servlet, HttpServletRequest request, HttpServletResponse response) {
        // Iniciamos las variables con las que vamos a trabajar
        HttpSession sesion = request.getSession();
        AccionServlet as=(AccionServlet) servlet;
        AccionRouter router = null;
        ResourceBundle recurso = (ResourceBundle) servlet.getServletContext().getAttribute("acciones-mapeo");
        ModeloSMS modelo = (ModeloSMS) servlet.getServletContext().getAttribute("ModeloSMS");
        ModeloCandidato modelocandidato = (ModeloCandidato) servlet.getServletContext().getAttribute("ModeloCandidato");
        
        ArrayList<String> errorm = new ArrayList<String>();
        ArrayList<String> mensajes = new ArrayList<String>();
        ArrayList<InformeSms> informes = new ArrayList<InformeSms>();
        ArrayList<SMSEnviosCandidato> envios = new ArrayList<SMSEnviosCandidato>();
        
        String[] idCandidatos = request.getParameterValues("canId");
        String[] numeros = request.getParameterValues("telefono");
        String[] nuevos = request.getParameterValues("nuevo");
        String plantilla = request.getParameter("plantilla");
        String textoSMS = request.getParameter("textosms");
        Integer idCon = Integer.parseInt(request.getParameter("idCon"));
        String aleatorio = (String) sesion.getAttribute("aleatorioEnviarSMS");

        Timestamp fecha = new Timestamp((new Date()).getTime());
        Boolean enviarSMS = true;
        
        if (aleatorio != null) {
            if (request.getParameter("aleatorioEnviarSMS") != null) {
                if (request.getParameter("aleatorioEnviarSMS").equals(aleatorio)) {
                    // Si se pulsa F5 o atras el aleatorio del request será igual al de la sesión.
                    // No debe enviarse el sms (ya se envió anteriormente)
                    enviarSMS = false;
                } else {
                    sesion.setAttribute("aleatorioEnviarSMS", request.getParameter("aleatorioEnviarSMS"));
                }
            }
        } else {
            sesion.setAttribute("aleatorioEnviarSMS", request.getParameter("aleatorioEnviarSMS"));
        }

        if (!Verificador.esCorrecto(textoSMS)) {
            errorm.add("error-sms-no-valido");
        }
        for (int i = 0; i < idCandidatos.length -1; i++) {
            if (numeros[i].isEmpty()) {
                continue;
            }
            if (!Verificador.esCorrecto(numeros[i])) {
                errorm.add("error-telefono-no-valido");
            }
        }
        if (!errorm.isEmpty()) {
            enviarSMS = false;
        }
        // Comprobamos que haya un usuario logueado
        if (sesion.getAttribute("usuario") != null && idCon != null && request.getMethod().equalsIgnoreCase("POST")) {
            if (enviarSMS) {
                if (request.getParameterValues("canId") != null) {
                    // Recorremos la lista de IDs de candidatos para añadirlos a los envios de SMS
                    for (int i = 0; i < idCandidatos.length; i++) {
                        SMSEnviosCandidato envio = new SMSEnviosCandidato();
                        envio.setIdCandidato(idCandidatos[i]);
                        envio.setMovil(numeros[i]);
                        envio.setMovilNuevo(nuevos[i]);
                        envio.setIdConvocatoria(idCon);
                        envio.setMensaje(textoSMS);
                        envio.setFechaHora(fecha);
                        envio.setSMSMenID(plantilla);
                        envios.add(envio);
                    }
                    // Recorremos la lista de envios para irlos enviando
                    for (SMSEnviosCandidato envioaux : envios) {
                        Candidato candidato=null;
                        InformeSms informe = new InformeSms();
                        try {
                            candidato = modelocandidato.visualizarCandidato(envioaux.getIdCandidato(), envioaux.getIdConvocatoria());
                            modelo.enviarSMSCandidato(envioaux, recurso);
                            if (envioaux.getIdRespuesta()==5){
                                informe.setIsEnviado(true);
                            }
                            // Mensaje enviado ok
                        } catch (GestorFormacionExcepcion ex) {
                            Logger.getLogger(EnviarSMSAlumnoAccion.class.getName()).log(Level.SEVERE, null, ex);
                            errorm.add(ex.getMessage());
                        }
                        // Segun vayamos enviando, añadimos registros al informe
                        informe.setNombre(candidato.getCanNom());
                        informe.setApellidos(candidato.getCanApe1() + " " + candidato.getCanApe2());
                        informe.setTelefono(envioaux.getMovil());
                        informe.setRespuestaEnvio(envioaux.getObservaciones());
                        informe.setSmsEnviado(envioaux.getMensaje());
                        informes.add(informe);
                    }
                    request.setAttribute("contenido", "visualizar-informe-sms");
                    request.setAttribute("informe", informes);
                    sesion.setAttribute("mensajes", mensajes);
                    request.setAttribute("errores", errorm);
                    request.setAttribute("idCon", idCon);
                    router = new AccionRouter("principal");
                } else {
                    request.setAttribute("errores", "error-no-sms");
                    try {
                        router=as.getFactory().getAction(as.getNombreClaseRecurso(visualizarconvocatoria),servlet.getClass().getClassLoader()).ejecuta(servlet, request, response);
                    } catch (ClassNotFoundException ex) {
                        Logger.getLogger(EnviarSMSAlumnoAccion.class.getName()).log(Level.SEVERE, null, ex);
                    } catch (InstantiationException ex) {
                        Logger.getLogger(EnviarSMSAlumnoAccion.class.getName()).log(Level.SEVERE, null, ex);
                    } catch (IllegalAccessException ex) {
                        Logger.getLogger(EnviarSMSAlumnoAccion.class.getName()).log(Level.SEVERE, null, ex);
                    }

                }
            } else {
                request.setAttribute("errores", errorm);
                try {
                    router=as.getFactory().getAction(as.getNombreClaseRecurso(visualizarconvocatoria),servlet.getClass().getClassLoader()).ejecuta(servlet, request, response);
                } catch (ClassNotFoundException ex) {
                    Logger.getLogger(EnviarSMSAlumnoAccion.class.getName()).log(Level.SEVERE, null, ex);
                } catch (InstantiationException ex) {
                    Logger.getLogger(EnviarSMSAlumnoAccion.class.getName()).log(Level.SEVERE, null, ex);
                } catch (IllegalAccessException ex) {
                    Logger.getLogger(EnviarSMSAlumnoAccion.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        } else {
            router = new AccionRouter("inicio");
        }

        return router;
    }

}
